<?php
/*
		Desc : Clase encargada del manejo de personas para el sistema
		Desc : Agrego la funcionalidad para el login y la seguridad de la sesion
		Desc : Se modificaron los metodos add, edit para que se peuda actializar correctamente
*/
  class PeopleController extends AppController
	{
		var $cacheAction = false;
		var $layout = 'menu';
		var $helpers = array('html', 'form','time','javascript','Pagination'); 
		  
		// Modelos que usa el controlador
		var $uses = array('Person','Address');
		  
		// Componentes que usa el controlador, por ahora en realidad no
		var $components = array('Pagination');


		/*
			Lista de personas que se encuentran en la base de datos
		*/                
		function index()
		{
			$this->pageTitle = 'Ver Personas';
			
			// Si me dan algo por get, es que se tiene que realizar una accion
			if (isset($this->namedArgs['id']))
			{
				if (isset($this->namedArgs['accion']))
				{
					$id = $this->namedArgs['id'];
					$accion = $this->namedArgs['accion'];
					if ($accion=="del")				// Se tiene que borrar a una persona
						$this->del($id);
					else if ($accion=="edit")			// Se tiene que editar a una persona
						$this->redirect("/people/add/id=$id");     
				}
			} 
			        
			$criteria='id_dependencia='.$this->getUserDependency();
			$this->Pagination->show = 5; //Cantidad de personas por pagina
			list($order,$limit,$page) = $this->Pagination->init($criteria); // Added
			$data = $this->Person->findAll($criteria, NULL, $order, $limit, $page); // Extra parameters added
			$this->set('personas',$data); 
		}
                
		/*
			Se acomoda la fecha para que sea un datatime 
			para la base de datos
		*/
		function getFecha()
		{
			return $this->data['Person']['fecha_nacimiento_year'].'-'.$this->data['Person']['fecha_nacimiento_month'].'-'.$this->data['Person']['fecha_nacimiento_day']." 00:00:00";
		}
		
		function getFechaGraduado()
		{
			return $this->data['Person']['fecha_graduado_year'].'-'.$this->data['Person']['fecha_graduado_month'].'-'.$this->data['Person']['fecha_graduado_day']." 00:00:00";
		}
		
		function validarClaustro()
		{
			$valid = true;
			if( $this->data['Person']['Docente'] && $this->data['Person']['legajo_docente']=='')
			{
				$this->Person->invalidate('legajo_docente');
				$valid = false;
			}

			if( $this->data['Person']['Alumno'] && $this->data['Person']['padron']=='')
			{
				$this->Person->invalidate('padron');
				$valid = false;
			}
							
			if( $this->data['Person']['TecAdm'] && $this->data['Person']['legajo_tecnico_admin']=='')
			{
				$this->Person->invalidate('legajo_tecnico_admin');
				$valid = false;
			}
							
			if( $this->data['Person']['Graduado'] && $this->data['Person']['titulo_graduado']=='')
			{
				$this->Person->invalidate('titulo_graduado');
				$valid = false;
			}
			
			return $valid;
		}
		
		function setClaustro()
		{
			$claustro = 0;
						
			if( $this->data['Person']['Docente'] )
			{
				$claustro = 1;
			}else{
				$this->data['Person']['legajo_docente']='';
			}

			if( $this->data['Person']['Alumno'] )
			{
				$claustro = $claustro | 2;
			}else{
				$this->data['Person']['padron']='';
			}
							
			if( $this->data['Person']['TecAdm'] )
			{
				$claustro = $claustro | 4;
			}else{
				$this->data['Person']['legajo_tecnico_admin']='';
			}
							
			if( $this->data['Person']['Graduado'] )
			{
				$claustro = $claustro | 8;
			}else{
				$this->data['Person']['titulo_graduado']='';
			}
				
			$this->data['Person']['claustro'] = $claustro;
		}
                
		function getClaustro()
		{
			$claustro = $this->data['Person']['claustro'];
						
			if( ($claustro & 1)>0 )
			{
				$this->data['Person']['Docente'] = 1;
			}

			if( ($claustro & 2)>0 )
			{
				$this->data['Person']['Alumno'] = 1;
			}
							
			if( ($claustro & 4)>0 )
			{
				$this->data['Person']['TecAdm'] = 1;
			}
							
			if( ($claustro & 8)>0 )
			{
				$this->data['Person']['Graduado'] = 1;
			}
			
		}
		
		/*
			Funcion que valida la persona antes de grabar
		*/
		function ValidPerson( $isUpdating = false )
		{
			$valid = true;
			
			// valido que si marco algun claustro, los campos esten llenos
			$valid = $this->validarClaustro();
			
			if( $this->data['Person']['numero_documento']!='' && $this->data['Person']['tipo_documento']!='' )
			{
				$query = '`Person`.`numero_documento`='.$this->data['Person']['numero_documento'].' AND `Person`.`tipo_documento`='.$this->data['Person']['tipo_documento'].' AND id_dependencia='.$this->getUserDependency();
				if($isUpdating)
				{
					$query = $query.' AND `Person`.`id` != '.$this->data['Person']['id'];
				}
				$persona = $this->Person->find($query);
				if ($persona)
				{
					//Error porque la persona ya existe
					$this->Person->invalidate('persona_unica');
					$valid = false;   
				}
			}
			if(!$valid)
				$this->set('error','No se puedo guardar. Vea los errores por favor.');
			return $valid;
		}

		/*
			Se agrega una persona.
			Hay que setear una flag porque uso la misma vista 
			tanto como para crear como para editar
		*/
		function add()
		{
			$this->set('size','20');
			$this->pageTitle = 'Registrar Personas';
			
			// Si se le pasa el id, es que es edicion
			if ( isset($this->namedArgs['id']) )
			{
				$this->pageTitle = 'Editar Persona';
				
				// Se setea la accion como edicion
				$this->set('action','edit');
				
				$id =$this->namedArgs['id'];
				
				// Se obtiene la persona
				$this->data = $this->Person->find("`Person`.`id`=$id");
				
				$this->getClaustro();
				
			}
			else
			{
				// Se setea la accion como para agregar una persona
				$this->set('action','add');
				if (empty($this->data))
				{                        	      
					$this->render();
					return;
				}

				if ( !$this->ValidPerson(false) )
				{
					$this->render();
					return;
				}
					
				$this->data['Person']['fecha_nacimiento'] =  $this->getFecha();
				
				// Se setea correctamente la fecha de graduado
				$this->data['Person']['fecha_graduado'] =  $this->getFechaGraduado();                                  	
				
				// Se setea correctamente si no es funcionario
				if ($this->data['Person']['is_funcionario']!= 1)
					$this->data['Person']['is_funcionario'] = 0;
					
				// Setea el claustro
				$this->setClaustro();
				
				// seteo la dependencia
				$this->data['Person']['id_dependencia'] = $this->getUserDependency();
				  		
				if ($this->Person->save($this->data))
				{
					// Se ve si hay direccion, si es asi se guarde 
					if(isset($this->data['Address']))
					{
						// Se le setea la foreing key                           	
						$id_persona = $this->Person->getLastInsertId();
						$this->data['Address']['person_id']=$id_persona;
						$this->Address->save($this->data['Address']);
					}
					$this->redirect('/people/index');
				}
			}
		}
                

		// Se actualizan los datos de una persona
		function update()
		{
			$this->pageTitle = 'Ver Personas';
			
			$this->set('size','20');
			if (empty($this->data))
			{                        	      
				$this->redirect('/people/index');
				return;
			}

			if ( !$this->ValidPerson(true) )
			{
				$this->set('action','edit');
				$this->render('add');
				return;
			}
			
			$this->data['Person']['fecha_nacimiento'] =  $this->getFecha();
			
			// Se setea correctamente la fecha de graduado
			$this->data['Person']['fecha_graduado'] =  $this->getFechaGraduado();                                  	
			
			// Se setea correctamente si no es funcionario
			if ($this->data['Person']['is_funcionario']!= 1)
			{
				$this->data['Person']['is_funcionario'] = 0;
			}
				
			// Setea el claustro
			$this->setClaustro();
			
			if( $this->Person->save($this->data['Person']) )
			{
				// Se actualiza la direccion
				$this->data['Address']['person_id'] = $this->data['Person']['id'];
				$this->Address->update($this->data['Address']);
				
				// Se redirecciona a la pagina que lista las personas
				$this->redirect('/people/index');
				return;
			}

			$this->set('action','edit');
			$this->render('add');
		}
                
                		
        // Se borra a una persona
        function del( $id=null )
        {
        	$this->pageTitle = 'BORRAR PERSONAS';
        	if( !empty($this->data['Person']['id']) )
				$id = $this->data['Person']['id'];
        	
			if ( $id )
			{
				$this->Person->del( $id );       
			}
			$this->redirect('/people/index');
		}

		// Se borra a una lista de personas seleccionadas
		function del_seleccion(){
			if (!empty($this->data)){
		       	foreach ($this->data['Person'] as $key => $person):
		    		if ($person != 0 ){
		    			$this->Person->del(ltrim($key));
		    		}
		    			
		    	endforeach;
			}
			$this->redirect('/people/index');
		}
        
    
		/*
			Funcion que permite buscar una persona.
			Se puedo buscar por:
				- Tipo de documento y numero, que resulta en una persona exacta
				Los siguiente tipos dan una lista de personas como resultados
				- Nombre 
				- Apellido
				- Nombre y apellido
		*/
		function find()
		{
			$this->pageTitle = 'Buscar Personas';
			
			$nombre   = $this->data['Person']['nombre'];
			$apellido = $this->data['Person']['apellido'];
			// se busca solamente por numero de documento
			if ($this->data['Person']['tipo_documento']!="" && $this->data['Person']['numero_documento']!="")
			{
				$persona = $this->Person->find('`Person`.`numero_documento`="'.$this->data['Person']['numero_documento'].
				'" AND `Person`.`tipo_documento`='.$this->data['Person']['tipo_documento'].' AND id_dependencia='.$this->getUserDependency());
				if ($persona)
				{
					$id = $persona['Person']['id'];
					$this->redirect('/people/add/id='.$id);
				}else
				{
					$this->set('error','No se encontraron resultados');
					$this->render();
				}
			}
			else  if ($nombre != '' || $apellido!='')
			{
				// Se busca por apellido y nombre
				$query = '';
				if ($nombre != '')
				{
					$query = '`Person`.`nombre` LIKE "%'.$nombre.'%"';
				}
				if ($apellido != '')
				{
					if( $query!='' )
						$query = $query.' AND ';
						
					$query = $query.'`Person`.`apellido` LIKE "%'.$apellido.'%"';
				}
				$query = $query.' AND id_dependencia='.$this->getUserDependency();
				
				// Se setea el resultado para que la vista lo pueda renderisar
				$result = $this->Person->findAll($query);
				if ($result)
				{
					$this->set('paging',0);				        
					$this->set('titulo',"Resultado de la busqueda");
					$this->set('personas', $result);
					$this->render('index');
				}
				else
				{
					$this->set('error','No se encontraron resultados');
					$this->render();
				}
			}
		}





		/*Desc: Muestra los datos completos de la persona seleccionada.
		*/
		function ver ($id)
		{
			if (isset($id))
			{
				//Obtengo los datos de la persona en cuestion.
				$persona = $this->Person->findByid($id);
				$this->set('datos_persona', $persona);
			}
		}


		function obtenerDestinatarios ($id)
		{
			return $this->Person->query("select * from people where exists (select * from destinations where id_documento = '$id' and id_persona = id);");
		}
		
       }
?>
